<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<input id="test" type="text">
<script>
description('This tests that calling input-method functions sends Composition Events and Text Events introduced in DOM Level 3. ' +
'To test manually, enable an IME, input CJK characters, and see this page doesn\'t show \'FAIL\' lines.');
</script>
<script>
function logCompositionStart(event) {
    shouldBeEqualToString('event.type', 'compositionstart');
    testPassed('event.data is "' + event.data + '"');
}

function logCompositionUpdate(event) {
    shouldBeEqualToString('event.type', 'compositionupdate');
    testPassed('event.data is "' + event.data + '"');
}

function logCompositionEnd(event) {
    shouldBeEqualToString('event.type', 'compositionend');
    testPassed('event.data is "' + event.data + '"');
}

function logTextInput(event) {
    shouldBeEqualToString('event.type', 'textInput');
    testPassed('event.data is "' + event.data + '"');
}

var test = document.getElementById('test');
test.focus();

// Add event listeners to the <input> node.
test.addEventListener('compositionstart', logCompositionStart, false);
test.addEventListener('compositionupdate', logCompositionUpdate, false);
test.addEventListener('compositionend', logCompositionEnd, false);
test.addEventListener('textInput', logTextInput, false);

// Case 1: Compose a text and commit it.
textInputController.setMarkedText('1', 0, 1);
textInputController.setMarkedText('2', 0, 1);
textInputController.setMarkedText('3', 0, 1);
textInputController.insertText('4');

// Case 2: Compose a text but cancel it.
textInputController.setMarkedText('5', 0, 1);
textInputController.setMarkedText('6', 0, 1);
textInputController.setMarkedText('7', 0, 1);
textInputController.setMarkedText('', 0, 0);

// Case 3: Insert a text without composition.
textInputController.insertText('8');

// Case 4: Compose a text and commit it by removing the mark.
textInputController.setMarkedText('9', 0, 1);
textInputController.unmarkText();

// Case 5: Compose a text on selection and commit it.
test.value = 'I have a pen';
test.selectionStart = 2;
test.selectionEnd = 6;
textInputController.setMarkedText('lost', 0, 1);
shouldBeEqualToString('test.value', 'I lost a pen');
textInputController.insertText('made');
shouldBeEqualToString('test.value', 'I made a pen');
</script>
</body>
</html>
